home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PAS_0693 / EXEGIF.PAS < prev    next >
Pascal/Delphi Source File  |  1993-06-30  |  3KB  |  124 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 146 of 262
  3. From : Jack Moffitt                        1:124/1301.0         19 Jun 93  16:23
  4. To   : Jason Vertucio
  5. Subj : The GIF EXE thing
  6. ────────────────────────────────────────────────────────────────────────────────
  7. JV>Okay, how about this: If I wanted to attach it to the back of an EXE, I
  8. JV>COPY /B it. Now, in the source code, how do I find the picture and set
  9. JV>everything up? I mean do you LoadGif (Ofs,Seg) or something? That's what
  10. JV>I mean, and I'm sorry to put you through this.
  11.  
  12. Ok..  here we go..  everyone seems to be asking this, so i'll just post
  13. some source.  Granted this is not a COMPLETE program, just an example on
  14. how to read the header, and get a pointer to the GIF.
  15.  
  16. ___------TEAR HERE------------}
  17. (* This code originally by Scott Johnson, I revised it later *)
  18.  
  19. function GetSize(N: byte): word;
  20. function GetData(N: byte): pointer;
  21. function GetDataCount: byte;
  22.  
  23. implementation
  24.  
  25. uses Dos;
  26.  
  27. type
  28.   DataRec = record
  29.     Size: word;
  30.     Loc: longint;
  31.   end;
  32.   DataArray = array [1..255] of DataRec;
  33.   DataArrayPtr = ^DataArray;
  34.  
  35. var
  36.   ExeFile: file;
  37.   DataCount: byte;         { count of data records }
  38.   Data: DataArrayPtr;
  39.  
  40. procedure OpenExe;
  41. begin
  42.   assign(ExeFile, ParamStr(0));
  43.   reset(ExeFile, 1);
  44. end;
  45.  
  46. procedure CloseExe;
  47. begin
  48.   Close(ExeFile);
  49. end;
  50.  
  51. type
  52.   ExeDataRec = record
  53.     ActSize: word;
  54.   end;
  55.  
  56. procedure InitExe;
  57. var
  58.    ExeHdr : record
  59.      M,Z  : char;
  60.      Len  : word;
  61.      Pages: word;
  62.    end;
  63.    ExeLoc : longint;
  64.    I: byte;
  65.    ExeData : ExeDataRec;
  66. begin
  67.   OpenExe;
  68.   BlockRead(ExeFile, ExeHdr, SizeOf(ExeHdr));
  69.   if ExeHdr.Len = 0 then ExeHdr.Len := $200;
  70.   ExeLoc := (longint(ExeHdr.Pages)-1) shl 9 + longint(ExeHdr.Len);
  71.   Seek(ExeFile, ExeLoc);
  72.   BlockRead(ExeFile, DataCount, 1);      { read data count byte }
  73.   Inc(ExeLoc);
  74.   GetMem(Data, SizeOf(DataRec) * DataCount);
  75.   for I := 1 to DataCount do
  76.   begin
  77.     Seek(ExeFile, ExeLoc);
  78.     BlockRead(ExeFile, ExeData, SizeOf(ExeData));
  79.     Data^[I].Loc := ExeLoc;
  80.     Data^[I].Size := ExeData.ActSize;
  81.     Inc(ExeLoc, ExeData.ActSize+2);
  82.   end;
  83.   CloseExe;
  84. end;
  85.  
  86. function GetSize(N: byte): word;
  87. begin
  88.   if N > DataCount then RunError(201);
  89.   GetSize := Data^[N].Size;
  90. end;
  91.  
  92. function GetData(N: byte): pointer;
  93. var P, D: pointer;
  94.     DataLoc: longint;
  95.     E: ExeDataRec;
  96. begin
  97.   if N > DataCount then RunError(201);
  98.   GetMem(P, Data^[N].Size);
  99.   OpenExe;
  100.   Seek(ExeFile, Data^[N].Loc+2);   { +2 is to get past info record }
  101.   BlockRead(ExeFile, P^, Data^[N].Size);
  102.   CloseExe;
  103.   GetData := P;
  104. end;
  105.  
  106. function GetDataCount: byte;
  107. begin
  108.   GetDataCount := DataCount;
  109. end;
  110.  
  111. begin
  112.   InitExe;
  113. end.
  114.  
  115. ___------TEAR HERE TOO!--------------
  116.  
  117. Ok.. that's it.  Call GetData(x) to get the location of the first
  118. element.  Datacount is the number of GIFs or whatever you have in there
  119. and the first two bytes are the actual size..  So to add a file, just
  120. make a temp file called ADDED.DAT, write a byte value for the datacount,
  121. and a word value for the filesize of the data you're adding, and then
  122. the data.  Hope this help all of you who wanted to be able to add ANSis,
  123. GIFs, and whatnot onto exes.  Also, with little modification, you can
  124. make it read from .DAT files with multiple gifs and stuff in them.